package com.huanzhidadi.single.thread;

import cn.hutool.core.util.RandomUtil;

/**步骤
1、定义 Runnable 接口的实现类，并重写run方法，run方法同样是该线程的执行体！
2、创建 Runnable 实现类的实例，并将此实例作为 Thread 的 target 创建一个Thread对象，该Thread对象才是真正的线程对象！
3、调用 start 方法启动该线程
Thread和Runnable的区别
如果一个类继承Thread，则不适合资源共享。但是如果实现了Runable接口的话，则很容易的实现资源共享
实现Runnable接口比继承Thread类所具有的优势：
  1）：适合多个相同的程序代码的线程去处理同一个资源
  2）：可以避免java中的单继承的限制
  3）：增加程序的健壮性，代码可以被多个线程共享，代码和数据独立
  4）：线程池只能放入实现Runable或callable类线程，不能直接放入继承Thread的类*/
public class ImplementRunnableTest {
    public static void main(String[] args) {
        MyThreadImplementRunnable runnable = new MyThreadImplementRunnable();
        for (int i=0; i<5; i++) {
            Thread thread = new Thread(runnable, "线程" + i);
            thread.start();
        }
        System.out.println( "主线程执行完了" );
    }
}

class MyThreadImplementRunnable implements Runnable {

    // run方法用来封装执行的代码
    @Override
    public void run() {
        long sleepTime = RandomUtil.randomLong(1000, 3000);
        try {
            //ThreadLocalRandom.current().nextLong(1000, 10000);
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "休眠" + sleepTime + "ms");
    }
}